package com.lx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication

//这个注解组合@ComponentScan（这是一个自动包扫描注解）默认扫描启动类的包和其子包
public class Application {

    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
    }
    /*
    Bean注册:
    @Compoent
    以下三个是 @Compoent的衍生注解
    @controller
    @service
    @respository

    怎么注册第三方jar包注入到ioc容器当中？
    如果这个要注册Bean对象来自于第三方（不是自定义的） 是无法使用 @Compoent及其衍生注解声明bean的

    @bean
    @import
    用于注册第三方jar包到第三方容器当中
    具体思路 声明一个方法 方法的返回值应该是这个jar对象 方法上使用上述两个注解
   不推荐
    如何判断第三方jar包注册成功？
    可以在spring启动类当中生成run方法的返回值对象 用该对象调用getBean()方法
    方法的参数当中就是当前jar的class文件 打印判断
   推荐做法
     创建一个config包 里面创建一个配置类
     在该类上使用@Configuration注解 声明该类是一个配置类
     类中的方法就返回你所需要的当前的jar包的对象 方法上使用@bean注解 注入到ioc容器当中

     @bean注解 对象默认的名字是方法名 可以在@bean注解当中指定名字 但是指定过后就不能再使用该方法名

     如果方法的内部需要使用到ioc容器当中已经存在的bean对象 那么只需要在方法上声明即可 spring会自动的注入

     */
    /*
    自动配置的原理：
            遵循约定大于配置的原则
            boot程序启动后 起步依赖中的一些bean对象会自动注入ioc容器当中

           1.首先在主启动类上添加了SpringBootApplication这个注解 它是一个组合注解 组合了一个非常重要的注解@EnableAutoConfiguration开启了自动配置
           2.而@EnableAutoConfiguration也是一个组合注解 它又组合了@Import({AutoConfigurationImportSelector.class})注解，在@Import其中导入了AutoConfigurationImportSelector这个类
           3.这个类是ImportSelector的实现类  这个实现类里面重写了selectImports()方法
           这个方法的内部通过层层调用最终会读取一个配置文件 这个配置文件就是META_INF下的spring下的后缀名为.imports的文件
           boot2以前的版本读取的是spring.factories文件
           4.读取到全类名以后会解析注册条件 也就是@Conditional及其衍生注解 把满足注册条件的Bean对象自动注入到ioc容器当中

           //第三步之后详解
           在这个配置文件里面 写了一堆的全类名 而且这些类都是自动配置类 其中一个类叫做（Dispatch Servler Auto Configurationg）
           它呢就是完成Dispatch Servler Auto Configurationg这个类的自动注入的 这个类上加入了一个@AutoConfiguration（标识当前的类是一个自动配置的类）
           还加入了另一个@ConditionalOnClass（用来设置bean注册的条件）如果说你的环境当中有DispatchServlerlet这个类 那么这个自动配置类就生效 如果说没有
           那么这个自动配置类就不生效（当你引入web起步依赖就有了这个类，如果说没有这个类 那么你就没有引入web起步依赖）因此才会说 当引入了web依赖 那么
           springBoot就能够自动注入一个DispatchServlelet

     */

}
